package shawn.projection;

/**
 * 投影接口
 * @author zhangzuoqiang
 * @date 2015年8月20日 上午10:29:15
 */
public interface Projection {
  
  /** 投影名称 **/
  public String getName();

  /**
   * 经纬度转换为墨卡托投影（Mercator Projection, 又称平面坐标）
   * @param llP
   * @param level
   * @return
   */
  public LngLatPoint lnglatToMercator(LngLatPoint llP, int level);

  /**
   * 平面坐标转换为像素坐标
   * 像素坐标 = |平面坐标 × 2 zoom - 18|
   * 不同级别下，同一个地理位置的像素坐标是不一样的，它与当前地图的级别相关。
   * @param mcP
   * @param level
   * @return
   */
  public PixelPoint mercatorToPixel(LngLatPoint mcP, int level);

  /**
   * 经纬度转换为像素坐标
   * @param llP
   * @param level
   * @return
   */
  public PixelPoint lnglatToPixel(LngLatPoint llP, int level);

  /**
   * 像素坐标转换为平面坐标
   * @param pP
   * @param level
   * @return
   */
  public LngLatPoint pixelToMercator(PixelPoint pP, int level);

  /**
   * 平面坐标转换为经纬度
   * @param mcP
   * @param level
   * @return
   */
  public LngLatPoint mercatorToLngLat(LngLatPoint mcP, int level);

  /**
   * 像素坐标转换为经纬度
   * @param pP
   * @param level
   * @return
   */
  public LngLatPoint pixelToLngLat(PixelPoint pP, int level);

  /**
   * 经纬度转换为图块坐标
   * 图块坐标 = |像素坐标 ÷ 256|
   * @param llP
   * @param level
   * @return
   */
  public TilePoint lnglatToTile(LngLatPoint llP, int level);

  /**
   * 平面坐标转换为图块坐标
   * @param mcP
   * @param level
   * @return
   */
  public TilePoint mercatorToTile(LngLatPoint mcP, int level);

  /**
   * 像素坐标转换为图块坐标
   * @param pP
   * @param level
   * @return
   */
  public TilePoint pixelToTile(PixelPoint pP, int level);

  /**
   * 
   * @param t
   * @param level
   * @return
   */
  public PixelPoint upperLeftOfTile(TilePoint t, int level);

  /**
   * 
   * @param t
   * @param level
   * @return
   */
  public PixelPoint lowerRightOfTile(TilePoint t, int level);

  /**
   * 获取两个经纬度之间的距离
   * @param p1
   * @param p2
   * @return
   */
  public double getDistanceByLL(LngLatPoint p1, LngLatPoint p2);

  /**
   * 
   * @param grid
   * @param level
   * @return
   */
  public PixelPoint gridToPixel(Grid grid, int level);

  /**
   * 
   * @param pP
   * @param level
   * @return
   */
  public Grid pixelToGrid(PixelPoint pP, int level);

  /**
   * 
   * @param level
   * @return
   */
  public int getGridWidthHeight(int level);

}
